package com.atguigu.tingshu.user.service.impl;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.JAXBUtil;
import com.alibaba.fastjson.JSONObject;
import com.atguigu.tingshu.common.constant.KafkaConstant;
import com.atguigu.tingshu.common.constant.RedisConstant;
import com.atguigu.tingshu.common.constant.SystemConstant;
import com.atguigu.tingshu.common.service.KafkaService;
import com.atguigu.tingshu.common.util.MongoUtil;
import com.atguigu.tingshu.model.user.UserListenProcess;
import com.atguigu.tingshu.user.service.UserListenProcessService;
import com.atguigu.tingshu.vo.album.TrackStatMqVo;
import com.atguigu.tingshu.vo.user.UserListenProcessVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;

import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@Service
@SuppressWarnings({"all"})
public class UserListenProcessServiceImpl implements UserListenProcessService {

	@Autowired
	private MongoTemplate mongoTemplate;

    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private KafkaService kafkaService;


    /**
     * 获取用户最近一次播放记录
     * /api/user/userListenProcess/getLatelyTrack
     */
    @Override
    public Map<String, Long> getLatelyTrack(Long userId) {
        Map<String, Long> map = new HashMap<>();
        Query query = new Query();
        query.addCriteria(Criteria.where("userId").is(userId));
        query.with(Sort.by(Sort.Direction.DESC,"updateTime"));
        query.limit(1);
        UserListenProcess mongoTemplateOne = mongoTemplate.findOne(query, UserListenProcess.class, MongoUtil.getCollectionName(MongoUtil.MongoCollectionEnum.USER_LISTEN_PROCESS, userId));
        if (mongoTemplateOne!=null){
            map.put("trackId",mongoTemplateOne.getTrackId());
            map.put("albumId",mongoTemplateOne.getAlbumId());
        }
        return map;
    }



    /**
     * 更新播放进度
     * /api/user/userListenProcess/updateListenProcess
     */
    @Override
    public void updateListenProcess(UserListenProcessVo userListenProcessVo,Long userId) {
        //查询是否已经存在播放记录
        //构建查询条件
        Query query = new Query();
        query.addCriteria(Criteria.where("userId").is(userId).and("trackId").is(userListenProcessVo.getTrackId()));
        //获取最新的一条
        query.with(Sort.by(Sort.Direction.DESC,"updateTime"));
        //只获取一个
        query.limit(1);
        //-------------
        UserListenProcess userListenProcess = mongoTemplate.findOne(query, UserListenProcess.class, MongoUtil.getCollectionName(MongoUtil.MongoCollectionEnum.USER_LISTEN_PROCESS, userId));

        if (userListenProcess!=null){
            //如果mongoDb有就是修改播放时间和修改时间
            //修改播放时长
            userListenProcess.setBreakSecond(userListenProcessVo.getBreakSecond());
            //修改更新时间
            userListenProcess.setUpdateTime(new Date());

        }else {
            //如果没有就是添加
            userListenProcess = new UserListenProcess();
            //设置用户ID
            userListenProcess.setUserId(userId);
            //设置声音ID
            userListenProcess.setTrackId(userListenProcessVo.getTrackId());
            //设置播放时长
            userListenProcess.setBreakSecond(userListenProcessVo.getBreakSecond());
            //设置专辑信息
            userListenProcess.setAlbumId(userListenProcessVo.getAlbumId());
            //设置是否显示
            userListenProcess.setIsShow(1);
            //设置新增时间
            userListenProcess.setCreateTime(new Date());
            //设置修改时间
            userListenProcess.setUpdateTime(new Date());
        }
        //存入MongoDB
        mongoTemplate.save(userListenProcess,MongoUtil.getCollectionName(MongoUtil.MongoCollectionEnum.USER_LISTEN_PROCESS, userId));
        //避免重复发送,存入redis一个独有的key
        String key = RedisConstant.ORDER_TRADE_NO_PREFIX + userId +":"+userListenProcessVo.getTrackId();
        //存入redis
        //DateUtil.endOfDay(new Date()) 获取当天结束的时间（23:59:59）。
        //getTime() 方法将日期对象转换为毫秒值。
        //System.currentTimeMillis() 获取当前时间的毫秒值。
        long ttl = DateUtil.endOfDay(new Date()).getTime() - System.currentTimeMillis();
        //如果不存在返回true
        Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent(key,userListenProcessVo.getTrackId(), ttl, TimeUnit.MICROSECONDS);
        //判断，如果结果为true发送kafka
        if (aBoolean){
            //发送消息更新当前声音的播放量
            TrackStatMqVo trackStatMqVo = new TrackStatMqVo();
            trackStatMqVo.setTrackId(userListenProcessVo.getTrackId());
            trackStatMqVo.setAlbumId(userListenProcessVo.getAlbumId());
            trackStatMqVo.setStatType(SystemConstant.TRACK_STAT_PLAY);
            trackStatMqVo.setCount(1);
            trackStatMqVo.setBusinessNo(IdUtil.fastSimpleUUID());
            kafkaService.sendMessage(KafkaConstant.QUEUE_TRACK_STAT_UPDATE, JSONObject.toJSONString(trackStatMqVo));
        }
    }




    /**
     * 获取声音的上次跳出时间
     * /api/user/userListenProcess/getTrackBreakSecond/{trackId}
     */
    @Override
    public BigDecimal getTrackBreakSecond(Long trackId, Long userId) {
        //构建查询条件
        Query query = new Query();
        query.addCriteria(Criteria.where("userId").is(userId).and("trackId").is(trackId));
        //获取最新的一条
        query.with(Sort.by(Sort.Direction.DESC,"updateTime"));
        //只获取一个
        query.limit(1);
        UserListenProcess one = mongoTemplate.findOne(query, UserListenProcess.class, MongoUtil.getCollectionName(MongoUtil.MongoCollectionEnum.USER_LISTEN_PROCESS, userId));

        if (one!=null){
            return one.getBreakSecond();
        }
        //如果查不到返回0.00
        BigDecimal bigDecimal = new BigDecimal(0.00);
        return bigDecimal;
    }


}
